package com.maikobi.maikobi.config;

import com.maikobi.maikobi.mapper.ChartMapper;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 线程池配置类
 *
 * 用于创建和配置一个线程池（ThreadPoolExecutor），以管理一组工作线程来执行任务。
 * 提供了自定义的线程工厂，用于创建具有特定名称的线程。
 *
 * @author: Maiko7
 * @create: 2025-07-16 8:47
 */
@Configuration
public class ThreadPoolExecutorConfig {

    @Resource
    private ChartMapper chartMapper;

    /**
     * 创建并配置一个ThreadPoolExecutor线程池
     *
     * @return 配置好的ThreadPoolExecutor实例
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // 自定义线程工厂，用于创建和配置线程
        ThreadFactory threadFactory = new ThreadFactory() {
            private final AtomicInteger count = new AtomicInteger(1);

            /**
             * 使用普通int计数，多线程环境下可能有问题
             *
             */
//            private int count = 1;

            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                // 为每个线程命名，便于识别和调试
                thread.setName("线程" + count.getAndIncrement());
//                count++;
                return thread;
            }
        };

        // 创建ThreadPoolExecutor实例，配置核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列和线程工厂
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
//                16,                           // 核心线程数（我电脑的内核是8） 因为是IO密集型2n，如果是cpu密集型则n+1
//                16,                          // 最大线程数
//                60L, TimeUnit.SECONDS,       // 非核心线程空闲存活时间
//                new ArrayBlockingQueue<>(60),  // 队列长度 60
//                threadFactory,               // 你的自定义线程工厂
//                new ThreadPoolExecutor.CallerRunsPolicy()  // 拒绝策略（调用者执行）
//        );
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
//                16,                           // 核心线程数（我电脑的内核是8） 因为是IO密集型2n，如果是cpu密集型则n+1
//                16,                          // 最大线程数
//                60L, TimeUnit.SECONDS,       // 非核心线程空闲存活时间
//                new ArrayBlockingQueue<>(60),  // 队列长度 60
//                threadFactory,               // 你的自定义线程工厂
//                new ChartRejectedExecutionHandler(chartMapper)  // 拒绝策略（调用者执行）
//        );

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                1,                           // 核心线程数（我电脑的内核是8） 因为是IO密集型2n，如果是cpu密集型则n+1
                2,                          // 最大线程数
                60L, TimeUnit.SECONDS,       // 非核心线程空闲存活时间
                new ArrayBlockingQueue<>(2),  // 队列长度 60
                threadFactory             // 你的自定义线程工厂
        );

        return threadPoolExecutor;
    }
}
